﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Drawing;
using System.Threading;
using InterfaceRemota;

namespace Gerenciamento
{
    public class ServidorImpl : MarshalByRefObject, IServidor
    {
        #region CHAT
        /*
        private static StreamWriter log;
        public StreamWriter Log
        {
            get {
                if (ServidorImpl.log == null)
                {
                    DateTime data = DateTime.Now;
                    String dia = data.ToShortDateString();
                    String hora = data.ToShortTimeString();
                    
                    String path = "c:\\MSMundiça\\logs\\log_";
                    path += dia.Replace("/", "-");
                    path += "_";
                    path += hora.Replace(":", "-");
                    path += ".txt";
                    ServidorImpl.log = new StreamWriter(path);
                }
                return ServidorImpl.log;
            }
        }*/

        private static List<InterfaceRemota.IMensagem> mensagens;
        public List<InterfaceRemota.IMensagem> Mensagens
        {
            get
            {
                if (ServidorImpl.mensagens == null)
                {
                    ServidorImpl.mensagens = new List<InterfaceRemota.IMensagem>();
                }
                return ServidorImpl.mensagens;
            }
            set { ServidorImpl.mensagens = value; }
        }

        private static List<InterfaceRemota.IUsuario> usuarios;
        public List<InterfaceRemota.IUsuario> Usuarios
        {
            get {
                if (ServidorImpl.usuarios == null)
                {
                    ServidorImpl.usuarios = new List<InterfaceRemota.IUsuario>();
                }
                return ServidorImpl.usuarios;
            }
            set { ServidorImpl.usuarios = value; }
        }

        public void enviaMensagem(InterfaceRemota.IMensagem mensagem,
            InterfaceRemota.IUsuario origem, InterfaceRemota.IUsuario destino,
            Boolean isPrivado)
        {
            if (isPrivado && origem != null && destino != null)
            {
                origem.recebeMensagem(mensagem);
                destino.recebeMensagem(mensagem);
            }
            else
            {
                geraLog(mensagem);
                Mensagens.Add(mensagem);
                atualizaMensagensDosUsuarios(mensagem);
            }
        }

        public byte[] getAvatarPorLogin(String login)
        {
            return GerenciadorDeAvatar.getInstancia().getAvatarPorLoginAsByteArray(login);
        }

        public void conectaUsuario(InterfaceRemota.IUsuario usuario)
        {
            if (!Usuarios.Contains(usuario))
            {
                Usuarios.Add(usuario);
                gerenciaStatusDoUsuario(usuario, "entrou na");
            }
        }

        public void desconectaUsuario(InterfaceRemota.IUsuario usuario)
        {
            if (Usuarios.Contains(usuario))
            {
                Usuarios.Remove(usuario);
                gerenciaStatusDoUsuario(usuario, "saiu da");
            }
        }

        private void gerenciaStatusDoUsuario(
            InterfaceRemota.IUsuario usuario, String msg)
        {
            atualizaUsuariosDosUsuarios();
            String user = usuario.Nome;
            user += " " + msg + " sala às " + DateTime.Now.ToShortTimeString() + ".";
            InterfaceRemota.IMensagem mensagem = geraMensagemStatus(user);
            atualizaMensagensDosUsuarios(mensagem);
            geraLog(mensagem);
        }

        private InterfaceRemota.IMensagem geraMensagemStatus(String msgm)
        {
            InterfaceRemota.IMensagem mensagem = new Gerenciamento.MensagemImpl();
            mensagem.A = Color.Red.A;
            mensagem.R = Color.Red.R;
            mensagem.G = Color.Red.G;
            mensagem.B = Color.Red.B;
            mensagem.NomeFonte = "Arial";
            mensagem.TamanhoFonte = 10;
            mensagem.EstiloFonte = FontStyle.Bold.ToString();
            mensagem.Mensagem = Gerenciamento.Codificador.codificaString(msgm);
            return mensagem;
        }

        private void atualizaUsuariosDosUsuarios()
        {
            foreach (InterfaceRemota.IUsuario usuario in Usuarios)
            {
                usuario.UsuariosConectados = Usuarios;
            }
        }

        private void atualizaMensagensDosUsuarios(InterfaceRemota.IMensagem mensagem)
        {
            foreach (InterfaceRemota.IUsuario usuario in Usuarios)
            {
                usuario.recebeMensagem(mensagem);
            }
        }

        private void geraLog(InterfaceRemota.IMensagem mensagem)
        {
            //Log.WriteLine(mensagem);
            //Log.Flush();
            String msg = mensagem.Mensagem;
            Console.WriteLine();
            Console.WriteLine(Codificador.decodificaString(mensagem.Mensagem));
            Console.WriteLine(mensagem);
        }

        public void chamaAtencao(InterfaceRemota.IUsuario origem, InterfaceRemota.IUsuario destino)
        {
            if (destino == null)
            {
                foreach (InterfaceRemota.IUsuario user in Usuarios)
                {
                    geraMsgmStatusAtencao(origem, user, " pediu atenção.");
                }
            }
            else
            {
                geraMsgmStatusAtencao(origem, destino, " pediu atenção à você.");
            }
        }

        private void geraMsgmStatusAtencao(
            InterfaceRemota.IUsuario origem, InterfaceRemota.IUsuario destino, String msgm)
        {
            destino.recebeMensagem(geraMensagemStatus(origem.Nome + msgm));
            destino.chamaAtencao();
        }

        public void enviaMensagemPrivada(InterfaceRemota.IUsuario origem,
            InterfaceRemota.IUsuario destino, InterfaceRemota.IMensagem mensagem)
        {
            destino.recebeMensagemPrivada(origem, mensagem);
        }

        public void enviaArquivo(byte[] arquivo, String fileName,
            IUsuario destino, IUsuario origem)
        {
            String mensagem = origem.Nome + " lhe enviou um arquivo.";
            geraLog(geraMensagemStatus(origem.Nome + " enviou arquivo para " + destino.Nome));
            destino.recebeArquivo(arquivo, fileName, origem, geraMensagemStatus(mensagem));
        }

        #endregion






        #region MENSAGENS PRIVADAS (próxima Versão)

        public void abreForm(IForm pai)
        {
            pai.recebe();
        }

        #endregion
    }
}
